<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promise</title>
</head>
<body>
<script>
    //回调地狱 新的请求要根据上一次请求的结果继续执行
    //级联选择器 省 -> 市 -> 县
    // (河北)A-> 石家庄/保定/唐山/邯郸B -> (///)C
    /*$.ajax({
        url: "a",
        success: function(res){
//            ...do somethig
            $.ajax({
                url: "b",
                success: function(res){
//            ...do somethig

                    $.ajax({
                        url: "c",
                        success: function(res){
//            ...do somethig

                        }
                    })
                }
            })
        },
        err: function(){

        }
    })*/

    //Promise 承诺 表示未来的某一个时间一定会返回一个承诺给你
    //异步的操作

    //promise可以解决回调地狱的问题




//    Promise是处理异步回调的解决方案
//    Promise对象是一个容器里面包裹了一个异步操作, 它表示一个预计会在未来完成的异步操作
//    promise有三种状态: pending(进行中) fulfilled(已成功) 和 rejected(已失败)
//    promise状态改变只有两种可能: 从pending变成fulfilled 或者 从pending变成rejected
//    promise状态一旦放生改变(凝固), 就会一直保持这个状态, 不会再发生变化
//    promise一旦状态改变, promise.then方法绑定的函数就会被调用



    //    pending (进行中
    //    fulfilled (已成功
    //    rejected (已失败
    // promise状态变化是固定的
    // pending -> fulfilled
    // pending -> rejected
    // 状态一旦发生改变, 就不会再发生变化了 ??

    {//一旦promise创建成功会立即执行
        let p1 = new Promise(function (reslove, reject) { //异步的操作
//            reslove 成功时候的回调
//            reject 失败时候的回调

            reslove();
//            reject();
            console.log(1)
        });

//        p1.then(成功时候的回调[,失败的回调])

        p1.then(
            success => {//fulfilled
                console.log(2);
            },
            err => {//rejected
                console.log(22)
            }
        );


        console.log(3);
        console.log(p1)
//        输出: 1 3 2
    }


    //promise错误捕获
    {
        //catch 错误不会 指定发生错误时的回调函数
        //finally 无论如何都会执行
        let fn1 = (num)=>{
            return new Promise((reslove, reject)=>{
                if(num >= 0){
                    reslove("大于等于0的数值")
                }else {
//                    reject("小于0的数值")
                    //模拟报错 手动抛出错误
                    throw new Error("----模拟代码报错, 错误01-----")
                }
            })
        };

        /*fn1(1).then(
            success => {
                throw new Error("----模拟代码报错, 错误02-----");
                console.log(success);
            },
            err => {
                console.log(err);
                console.log("12345")
            }
        ).catch(
            cat => {
                console.log("catch", cat)
            }
        );*/
       /* fn1(-1).then(
            success => {
                throw new Error("----模拟代码报错, 错误02-----");
                console.log(success);
            }
        ).catch(
            cat => {
                console.log("catch", cat)
            }
        );*/


        fn1(1).then(
            success => {
                throw new Error("----模拟代码报错, 错误02-----");
                console.log(success);
            },
            err => {
                console.log(err);
                console.log("12345")
            }
        ).catch(
            cat => {
                console.log("catch", cat)
            }
        ).finally(//无论如何都会执行
            fina => {
                console.log("finally====>", fina)
            }
        );

    }


    //普通代码中的错误捕获
    {//应用场景: 在不同浏览器下 可能部分代码会报错 这个使用用try catch进行错误捕获和浏览器兼容性处理
        try {
            console.log(1);
            console.log(2);
            throw new Error("----模拟代码报错, 普通代码中的错误捕获-----");
            console.log(3);
            console.log(4);
        }catch (err){
            console.log(err)
        }
    }





</script>
</body>
</html>